Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Pomoc z językiem skryptowym!


Rekomendowane odpowiedzi

Opublikowano

Hej, otóż zacząłem tworzyć własny język skryptowy w C++ i chciałem zrobić funkcję count do liczenia, ale nie działa.

Oto jaki mam kod: 

#include <iostream>// cout, cin, cerr, getline
#include <string>  // string
#include <vector>  // vector
#include <fstream> // fstream
#include <cstdlib> // atof
#include <map>     // map
#include <conio.h> // getchar
#include <fstream> // odczyt i zapis do pliku

using namespace std;
 
class FileScriptManager //Opis klasy do uruchamiania skryptu z pliku.
{
    public:
        FileScriptManager( const char* ); //Laduje plik i wywoluje wykonanie skryptu.
        ~FileScriptManager(); //Zamyka plik.
 
    protected:
        void execute_Script(); //Wykonuje skrypt.
        void execute_Command( vector<string> ); //Wykonuje pojedyncza komende.
        vector<string>get_Current_Arguments(); //Rozbija pobrana linie skryptu na czesci.
 
    private:
        fstream m_File; //plik
        map<string, double> m_Set_Number_Variables; //Kontener przechowuje wartosci liczb. Odwolujemy sie po nazwie.
 
};
 
FileScriptManager::FileScriptManager( const char* file_Path )
{
    m_File.open( file_Path, ios::in ); //Zaladuj plik w trybie do odczytu.
    if( m_File.good() ) execute_Script(); //Jesli mamy dostep to wykonaj skrypt.
    else cerr << "ERROR! Cannot display file!" << endl; //Jesli nie wyrzuc error.
}
 
FileScriptManager::~FileScriptManager()
{
    m_File.close(); //Zamknij plik.
}
 
void FileScriptManager::execute_Script()
{
    while( !m_File.eof() ) execute_Command( get_Current_Arguments() ); //Dopoki nie dojedziesz do konca pliku wykonuj komendy.
    /* Wykonuj komendy (Pobierz komedy z aktualnej linii) */
}
 
void FileScriptManager::execute_Command( vector<string> new_Arguments )
{
    if( new_Arguments[0] == "" || new_Arguments.empty() ) return; //Jesli linia pusta pomin.
    else if( new_Arguments[0] == "Display" ) //Polecenie display. Wyswietlanie argumentow.
    {
        cout << new_Arguments[1];
        for( long double i = 2; i < new_Arguments.size(); ++i )
            cout << " " << new_Arguments[i];
        cout;
 
    }else if( new_Arguments[0] == "EDisplay" ) //Polecenie display z przejsciem do nastepnej linii. Wyswietlanie argumentow.
    {
        cout << new_Arguments[1];
        for( long double i = 2; i < new_Arguments.size(); ++i )
            cout << " " << new_Arguments[i];
        cout << endl;
 
    }else if( new_Arguments[0] == "Set" ) //Polecenie set. Dodaje do mapy zmienna z aliasem. Konwertujemy drugi lancuch na typ float.
    {
        m_Set_Number_Variables.insert( pair<string, double>( new_Arguments[1], atof(new_Arguments[2].c_str()) ) );
 
    }else if( new_Arguments[0] == "VarAll" ) //Wyswietla zmienna o podanej nazwie.
    {
        cout << new_Arguments[1] << " = " << m_Set_Number_Variables[new_Arguments[1]];
 
    }else if( new_Arguments[0] == "EVarAll" ) //Wyswietla zmienna o podanej nazwie.
    {
        cout << new_Arguments[1] << " = " << m_Set_Number_Variables[new_Arguments[1]] << endl;
 
    }else if( new_Arguments[0] == "Var" ) //Wyswietla zmienna o podanej nazwie.
    {
        cout << m_Set_Number_Variables[new_Arguments[1]];
 
    }else if( new_Arguments[0] == "EVar" ) //Wyswietla zmienna o podanej nazwie.
    {
        cout << m_Set_Number_Variables[new_Arguments[1]] << endl;
 
    }else if( new_Arguments[0] == "Do" )
    {
        cin >> m_Set_Number_Variables[new_Arguments[1]];
 
    }else if( new_Arguments[0] == "Count" )
    {
        m_Set_Number_Variables [new_Arguments[1]];
    }else if( new_Arguments[0] == "Exit" ) std::exit( EXIT_SUCCESS );
	else cerr << "ERROR! Undefined command. This line will be ignored!"; //Jesli komenda nie istnieje wykrzycz!
}
 
vector<string> FileScriptManager::get_Current_Arguments()
{
    string temp_Command, temp_Arg; //Zmienne pomocnicze.
    vector<string> temp_Vect; //Kontener ktory zwrocimy.
    getline( m_File, temp_Command ); //Pobieram linie.
 
    for( long double i = 0; i <= temp_Command.length(); ++i ) //Rozbijam ja na czesci.
    {
        if( temp_Command[i] > 32 ) temp_Arg += temp_Command[i]; //Jesli nie spacja i nie koniec wyrazu. Kod ascii spacji 32, nulla 0.
        else
        {
            temp_Vect.push_back( temp_Arg ); //Dodaje wyraz do kontenera.
            temp_Arg = ""; //Czyszcze wyraz pomocniczy.
        }
    }
 
    return temp_Vect; //Zwracam kontener.
}
 
int main( void )
{
    FileScriptManager( "script.ps" ); //Odpalam skrypt.
    getchar();getchar();
    return 0;
}

A za liczenie miał być odpowiedzialny fragment

else if( new_Arguments[0] == "Count" )
    {
        m_Set_Number_Variables [new_Arguments[1]];
    }

Aczkolwiek nie chce działać. Proszę o pomoc w poprawie powyższego fragmentu.

 

Do przetestowania zrobiłem taki skrypt w języku:

EDisplay -~"|+|"~- 
EDisplay in P v.0.1 
EDisplay   
EDisplay   
Display Liczba1:  
Do 1N 
Display Liczba2:  
Do 2N 
EDisplay   
Count Wynik+=1N
Count Wynik+=2N
Var 1N 
Display  +  
Var 2N 
Display  =  
Var Wynik

Jeśli zadziała to znaczy, że się udało :D

 

A jeszcze jakby ktoś wiedział to prosiłbym o pomoc w zrobieniu typu zmiennych przechowujących tekst.

jw19e8.png

Opublikowano

Co znaczy według ciebie, że nie działa? Czego oczekujesz?

bo

m_Set_Number_Variables [new_Arguments[1]];

nie robi nic konkretnego.

Wrzuca jedynie

"Wynik+=1N" do mapy

Opublikowano

Usunąłem inne rzeczy przed m_Set_Number_Variables [new_Arguments[1]];  dlatego, że nie działały. Po za tym przychodzę na to forum właśnie dlatego, aby uzyskać pomoc odnośnie tego, co ma być zawarte przed m_Set_Number_Variables [new_Arguments[1]];. Ale słusznie zauważyłeś że to polecenie nie ma przeznaczenia bo jest niedokończone ;p.

 

Wyrażę się nieco jaśniej. Otóż chciałem uzyskać coś np takiego:

 

count liczba = 2+2

Czyli że liczba to po prostu obliczenie 2+2

 

Albo też z użyciem zmiennych, w tym przypadk

count wynik = 1L+2L

 

Próbowałem przed powyższa komendą wpsiać new_Arguments[1] = 

 

Bowiem miałem nadzieję że w takim wypadku C++ zrozumie to jako

wynik = 1L+2L

aczkolwiek tak również się nie udało, bowiem nadal jako zmienną wynik podaje 0.

jw19e8.png

Opublikowano

@Sopelek997

 

Po prostu tak w c++ zapisuje się działania. Jak w zeszycie. Jeśli się mylę, to przepraszam. Zaś jeśli wiesz jak można uzyskać zamierzony efekt prosiłbym o pomoc w edycji wcześniej już wspomnianego wycinka kodu.

jw19e8.png

Opublikowano

W c++ tak.

Ale ty masz tylko stringa z jakimś działaniem i twój program nie wie co ma z nim zrobić. Magicznie go nie wykona w taki sposób jak chcesz, musisz samemu napisać kod, który to zrobi.

Najlepiej jest przekonwertować zapis do odwrotnej notacji polskiej

http://en.wikipedia.org/wiki/Shunting-yard_algorithm

a potem wykonać po kolej odpowiednio zaprogramowane operacje.

Opublikowano

Czyli że mam przeanalizować jaki typ działania jest wykonywany, następnie obliczyć go a wynik przesłać z powrotem do języka skryptowego?

jw19e8.png

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...